package com.study.common.easyexcel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 该类不能被spring管理，因为每次读取excel都要new,
 * 里面如果用到spring的bean，则可以构造方法传进去
 */
public class EasyExcel_01_Listener extends AnalysisEventListener<EasyExcel_01> {
    Logger logger = LoggerFactory.getLogger(this.getClass());
    List<EasyExcel_01> dataList = new ArrayList<>();//数据列表
    final static int batch_operator_count = 2;//批量操作数量，是为了控制防止到最后才操作数据，导致内存中数据量过大

    /**
     * 每次读取一行数据
     * @param data
     * @param context
     */
    @Override
    public void invoke(EasyExcel_01 data, AnalysisContext context) {
        logger.info("读取到的数据为：{}",data.toString());
        dataList.add(data);
        if(dataList.size() > batch_operator_count){
            saveDataToDb();
        }
    }

    private void saveDataToDb() {
        for (EasyExcel_01 easyExcel_01 : dataList) {
            logger.info("本次操作的数据为：{}",easyExcel_01.toString());
        }
        dataList.clear();
    }

    /**
     * sheet的数据都读取完毕，调用该方法
     * 多个sheet,则各自在数据读取完毕后调用，互不影响
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        if(!dataList.isEmpty()){
            saveDataToDb();
        }
    }

    /**
     * 这里会一行行的返回头
     *
     * @param headMap
     * @param context
     */
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        logger.info("解析到一条头数据:{}", JSON.toJSONString(headMap));
    }
}
